package singletontest;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * 什么是延迟加载？延迟加载就是在调用 get() 方法时实例才被创建，常见的实现方法就是在 get() 方法中进行 new() 实例化。
 *
 * @author liuziyang
 * @create 2019-10-14 20:00
 */
public class SingletonTest2 {
    private static SingletonTest2 myObject;

    public SingletonTest2() {

    }

    /**
     * 从运行结果来看，创建了三个对象，并不是真正的单例模式。原因显而易见，3个线程同时进入了if (myObject == null) 判断语句中，最后各自都创建了对象。
     *
     * @return
     */
    public static SingletonTest2 getInstance() {
        try {
            if (myObject == null) {
                //模拟对象在创建之前做的一些准备工作
                Thread.sleep(3000);
                myObject = new SingletonTest2();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return myObject;
    }


    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest2.getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest2.getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest2.getInstance().hashCode());
            }
        }).start();
    }
}
